DP还能干这个?——transfer learning应用之D3修正
最近,一些DP使用者们遇到了这样的问题:生成了一堆数据集训练了DP势,结果因为数据精度不高导致模型表现不佳,或者开始选错了赝势导致无法应用于某些特定问题。重做一轮DPGEN开销过大,承担不起,那有没有什么好方法把已有的DP模型“转移”到另一个势能面上呢?
本文将为大家介绍,DP的transfer learning功能,以D3修正为例。当然D3修正可以通过其它方法实现,文章后面也会进行简单介绍。大家可以根据自己的需求,设定transfer learning的场景。
DPGEN v0.8.0之后的版本加入了simplify功能,该功能实现过程描述如下,也可对照笔者文末提供的参考文献帮助理解。基于通常DPGEN流程生成了4个DP模型,以及DFT数据集,从DFT数据集中随机挑选构型进行relable。
注意,此时relabel设置的参数与生成前序DFT数据集的参数不一样。这样我们得到了一个新的DFT数据集。基于新的数据集,对旧的DP模型进行init-model,embedding-net不训练,fitting-net固定内3层网络,只训练最外层。当然可以不止训练最外层,笔者的例子中训练最外层和次外层效果相差不大,所以只训练了最外层。大家可以针对自己的例子进行测试,确定训练策略。这样得到的4个新模型再对随机挑选的构型做dptest,得到model_deviation,根据自己设计的trust_lo/hi选取构型进行DFT relabel,进一步扩充数据集。基于以上的流程多次迭代,最终使原DP模型 transfer到新的势能面上,完成transfer learning。
Simplify 的脚本例子如下,和 DPGEN 的差不多:
{
"type_map": [ "Ag", "Au" ],
"mass_map": [ 108, 196.967 ],
"init_data_prefix": "",
"init_data_sys": [],
"pick_data": "/Ag-Au/simp/collect",
这里需要使用 dp collect 功能将原DFT数据集整理至一个文件夹中
"sys_batch_size": "auto",
"training_iter0_model_path": "/Ag-Au/final/00.train/00[0-3]",
指定原DP模型
"training_init_model": true,
Transfer learning 是基于原DP模型的 init-model
"numb_models": 4,
"train_param": "input.json",
"default_training_param" : {
"_comment": " model parameters",
"model": {
"type_map": ["Ag", "Au"],
"descriptor" :{
"type": "se_a",
"sel": [150,150],
"rcut_smth": 2.00,
"rcut": 6.00,
"neuron": [25, 50, 100],
"trainable": false,
Embedding net 不训练
"resnet_dt": false,
"axis_neuron": 12,
"seed": 0,
"_comment": " that's all"
},
"fitting_net" : {
"neuron": [240, 240, 240],
"resnet_dt": true,
"trainable": [false, false, false, true],
Fitting net 只训练最外层
"seed": 1,
"_comment": " that's all"
},
"_comment": " that's all"
},
"learning_rate" :{
"type": "exp",
"start_lr": 0.001,
"stop_lr": 3.51e-8,
"decay_steps": 2000,
"_comment": "that's all"
},
"loss" :{
"start_pref_e": 100,
"limit_pref_e": 100,
"start_pref_f": 1,
"limit_pref_f": 1,
"start_pref_v": 0.9,
"limit_pref_v": 1.0,
"_comment": " that's all"
},
"_comment": " traing controls",
"training" : {
"systems": [],
"set_prefix": "set",
"stop_batch": 400000,
"batch_size": 2,
"seed": 1,
"_comment": " display and restart",
"_comment": " frequencies counted in batch",
"disp_file": "lcurve.out",
"disp_freq": 2000,
"numb_test": 2,
"save_freq": 2000,
"save_ckpt": "model.ckpt",
"load_ckpt": "model.ckpt",
"disp_training":true,
"time_training":true,
"profiling": false,
"profiling_file":"timeline.json",
"_comment": "that's all"
},
"_comment": "that's all"
},
"fp_style": "vasp",
"fp_skip_bad_box": "length_ratio:5;height_ratio:5",
"shuffle_poscar": false,
"fp_task_max": 100,
每轮最多 relabel 100 个 DFT 数据
"fp_task_min": 0,
这样设置保证第一轮随机选出的所有 DFT 数据都可以送去 relabel
"fp_pp_path": "vasp_input",
"fp_pp_files": ["POTCAR_Ag", "POTCAR_Au"],
"fp_incar": "vasp_input/INCAR",
"use_clusters": false,
"labeled": false,
"init_pick_number":100,
"iter_pick_number":100,
"e_trust_lo":1e10,
"e_trust_hi":1e10,
"f_trust_lo":0.20,
"f_trust_hi":100.00,
所有高于f_trust_lo的构型都会被选为候选构型。因为构型都是从数据集中选择的,认为这些构型都是合理的,所以不进行剔除bad box或者原子过近等各种不合理构型的设置。
"_comment": " that's all "
}
笔者的例子是Ag-Au合金的,原本的DP模型和数据集基于PBE生成,应用中发现D3修正可以更好地描述合金基本性质以及表面性质,所以想将模型 transfer 到D3修正的势能面上。文章中采用了 transfer learning 的方式实现,relabel 的数据仅占原数据集的0.6%,transfer learning 仅进行了 4 个 iter 便收敛了。
然而,D3 修正很便宜,给出原子坐标和盒子的信息就可以实现。有一些代码可以做到,比如:
https://chemie.uni-bonn.de/pctc/mulliken-center/software/dft-d3/get-the-current-version-of-dft-d3
https://github.com/MMunibas/PhysNet/blob/master/neural_network/grimme_d3/grimme_d3.py
https://github.com/loriab/dftd3
https://github.com/dftbplus/dftd3-lib
笔者在文中采用了最后一个网址提供的脚本,对所有数据进行了 D3 relabel,确实很快。基于 D3 修正的 DFT 数据集重新训练了一版DP模型,经过测试发现,对Au的fcc和hcp的相对稳定性预测有问题,以及文中的例子,Au (111) 表面重构的计算不准确。这里可能有些tricky的问题存在,需要进一步研究探索。
想做 D3 修正的胖友们,可以 transfer learning 和 D3 relabel 两种方案都尝试下,以及活用 init-model,选择最适合自己的解决办法。希望大家都能得到自己想要的DP势!
参考文献
Transfer learning 在Ag-Au体系中的实现:
YiNan Wang et al 2022 Modelling Simul. Mater. Sci. Eng. 30 025003
D3修正:
Grimme S, Antony J, Ehrlich S and Krieg H 2010 J. Chem. Phys. 132 154104
- End -
(如需转载图文请与公众号后台联系)
-----------------------------------------------
推荐阅读
DP-GEN:Deep Potential GENerator 基于同步学习的深度势能生成器